#ifndef _MATRIX
#define _MATRIX

#include "Base.h"

#include <cstring>
#include <cstdio>

using namespace std;

class Row
{
public:
  
  union
  {
    struct { fp m1,m2,m3,m4; };
    struct { fp m[4]; };
  };
  
  Row(
    const fp _m1=0.0f,
    const fp _m2=0.0f,
    const fp _m3=0.0f,
    const fp _m4=0.0f
  );
  Row(const Row& r);
  
  void Set(
    const fp _m1,
    const fp _m2,
    const fp _m3,
    const fp _m4
  );
  void Mul(const fp k);
  void Div(const fp k);
};

class Matrix
{
public:

  Row *z[3];
      
  Matrix();
  ~Matrix();
  
  void Swap(const ui32 i, const ui32 j);
  void Add(const ui32 i, const ui32 j, const fp k);
  bool Check(const ui32 i, const ui32 j) const;  
  void Set(
    const ui32 i,
    const fp m1,
    const fp m2,
    const fp m3,
    const fp m4
  );
  bool Solve();
};

#endif // _MATRIX
